package com.moonzero.utils;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 记录日志工具类
 *
 * @author MoonZero
 */
public class Logger {

    /**
     * 前置通知 作用：在业务层执行核心方法之前执行此方法记录日志
     */
    public void beforePrintLog() {
        System.out.println("前置通知：正在记录日志。。。。。。");
    }

    /**
     * 后置通知 作用：在业务层执行核心方法之后执行此方法记录日志
     */
    public void afterReturnningPrintLog() {
        System.out.println("后置通知：正在记录日志。。。。。。");
    }

    /**
     * 异常通知 作用：在业务层执行核心方法出现异常后执行此方法记录日志
     */
    public void afterThrowingPrintLog() {
        System.out.println("异常通知：正在记录日志。。。。。。");
    }

    /**
     * 最终通知 作用：在业务层执行核心方法最终执行此方法记录日志
     */
    public void afterPrintLog() {
        System.out.println("最终通知：正在记录日志。。。。。。");
    }


    /**
     * 环绕通知:是spring提供给我们的特殊通知，需要我们手动调用目标方法
     * 在调用目标方法之前的输出的就是前置通知
     * 在调用目标方法之后的输出的就是后置通知
     * 在调用目标方法之后有异常的输出的就是异常通知
     * 不管有无异常都会执行的代码是最终通知
     */
    public Object aroundPrintLog(ProceedingJoinPoint pjp) {
        // 获取方法参数列表
        Object[] args = pjp.getArgs();
        // 定义返回变量
        Object result = null;

        try {
            // 前置通知
            System.out.println("前：记录日志。。。");
            // 手动调用目标方法
            result = pjp.proceed(args);
            // 后置通知
            System.out.println("后：记录日志。。。");
        } catch (Throwable e) {
            e.printStackTrace();
            // 异常通知
            System.out.println("异：记录日志。。。");
        } finally {
            // 最终通知
            System.out.println("终：记录日志。。。");
        }

        return result;
    }
}
